package com.heatup.apt.api.service;

import com.heatup.apt.common.exception.OrderException;
import com.heatup.apt.common.exception.OrderNotFoundException;
import com.heatup.apt.model.AccessDevice;
import com.heatup.apt.model.DoorAccessPwd;
import com.heatup.apt.model.QRDoor;
import com.heatup.apt.model.management.SysUser;
import com.heatup.apt.model.order.OrderInfo;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * Created by Blank on 2016-10-18.
 */
public interface AccessService {

    /**
     * 更新门禁在线状态
     *
     * @param accessDevice
     * @return
     */
    boolean updateDoorDeviceHeartBeat(AccessDevice accessDevice);

    /**
     * 查询用户密码是否正确
     *
     * @param cardN  密码
     * @param serial 门禁设备ID
     * @return
     */
    boolean checkQRCodePwd(String cardN, String serial);

    /**
     * 记录门禁密码使用资源
     *
     * @param serial
     * @param password
     * @param pwdWasRight
     * @param isSuperPin
     * @return
     */
    boolean updateAccessDevicePWDUsedCount(String serial, String password, boolean pwdWasRight, boolean isSuperPin);


    /**
     * 教练查询门禁密码
     *
     * @param coachId 教练ID
     * @return
     */
    DoorAccessPwd queryCoachAccessPwd(Integer coachId);

    /**
     * 查询教练密码状态
     *
     * @return
     */
    Map<String, Object> queryCoachPwdStatus(Integer userId);

    /**
     * 创建教练/系统用户 门禁密码
     *
     * @param mobile       手机号码
     * @param storeId      门店ID (or null)
     * @param relationType 密码类型 0订单 1教练 2系统用户
     * @return
     */
    void createCoachOrSysUserPwd(String mobile, Integer storeId, Integer relationType);

    /**
     * 查询教练密码
     *
     * @param mobile 教练手机号码
     * @return
     */
    List<DoorAccessPwd> queryDoorPwdByMobile(String mobile);

    /**
     * 查询教练密码
     *
     * @param coachId 教练ID
     * @return
     */
    List<DoorAccessPwd> queryDoorPwdByCoachId(Integer coachId);

    /**
     * 查询系统用户密码
     *
     * @param sysUserId 系统用户ID
     * @return
     */
    List<DoorAccessPwd> querySystemUserPwdBySysUserId(Integer sysUserId);

    /**
     * 查询系统用户
     *
     * @param mobile 系统用户手机号
     * @return
     */
    SysUser querySysUserByMobile(String mobile);

    /**
     * 查询系统用户密码
     *
     * @param mobile
     * @return
     */
    List<DoorAccessPwd> querySystemUserPwdBySysUserMobile(String mobile);

    /**
     * 同步门禁离线扫码数据
     *
     * @param qrDoor 离线使用数据
     * @return true 同步成功 / false 同步失败
     */
    boolean updateDoorDeviceOfflineData(QRDoor qrDoor);

    /**
     * 获取当天不重复的8位门禁密码
     *
     * @return 当天不重复的8位门禁密码
     */
    String returnNewRandomPassword();

    /**
     * 查询订单对应的门禁 QRCode
     *
     * @param orderId 订单 ID
     * @return 查询2分钟内有效的 QRCode Base64 String
     */
    Map<String, Object> updateAndGetNewQRCodeByOrderId(Integer orderId) throws OrderNotFoundException;

//    /**
//     * 将新生成的密码保存或更新回到当前订单中 防止开门校验密码错误
//     *
//     * @param orderInfo 订单
//     * @param password  新的密码
//     * @param startTime 有效时间
//     * @param endTime   失败时间
//     * @return true 更新成功 / false 更新失败
//     * @throws OrderException 如果订单 ID/ 密码为空则抛出
//     * @author blank 2017/11/8 下午6:04
//     */
//    boolean insertOrUpdateNewDoorAccessPwd(OrderInfo orderInfo, String password, Date startTime, Date endTime) throws OrderException;
}
